#ifndef PLAN_H
#define PLAN_H

// 修改枚举名称和枚举值，避免与 ast.h 冲突
typedef enum {
    PLAN_NODE_CREATE, PLAN_NODE_INSERT, PLAN_NODE_SELECT, PLAN_NODE_DELETE,PLAN_NODE_DROP, PLAN_NODE_ALTER, PLAN_NODE_UPDATE,PLAN_NODE_SEQSCAN, PLAN_NODE_FILTER, PLAN_NODE_PROJECT
} PlanNodeType;

typedef enum { PLAN_COL_INT=1, PLAN_COL_VARCHAR=2 } PlanColType;

// 修改结构体定义中的类型引用
typedef struct {
    const char *table_name;
    int ncols;
    const char **col_names;
    const PlanColType *col_types;   // 与 columns 表一致
} CreateParams;

typedef struct {
    const char *table_name;
    int ncols;
    const char **col_names;     // 可为空表示“按表定义顺序”
    const char **values_as_text; 
} InsertParams;

typedef struct {
    const char *table_name;
    int nproj;
    const char **proj_cols;     // SELECT 列表
    const char *where_expr;     // 文本表达式
} SelectParams;

typedef struct {
    const char *table_name;
    const char *where_expr;     // DELETE 的条件
} DeleteParams;

// DROP TABLE 参数
typedef struct {
    const char *table_name;
    int if_exists;  // 1表示IF EXISTS存在，0表示不存在
} DropParams;

// ALTER TABLE 参数
typedef struct {
    const char *table_name;
    const char *action;   // 操作类型
    const char *column_name;  // 涉及的列名
    PlanColType column_type;  // 列类型
    int column_length;  // 列长度
} AlterParams;

// UPDATE 参数
typedef struct {
    const char *table_name;
    int nset;  // SET子句的数量
    const char **col_names;  // 要更新的列名
    const char **values_as_text;  // 更新后的值
    const char *where_expr;  // WHERE子句
} UpdateParams;

// 修改 PlanNode 结构体中的类型引用
typedef struct PlanNode {
    PlanNodeType type;
    void *params;
    struct PlanNode *child;
} PlanNode;

void print_plan(const PlanNode* plan, int indent);
void free_plan(PlanNode* plan);
#endif
